ML Clínico · Bioestadística Aplicada · Nivel Intermedio

Algoritmos de
Machine Learning
para datos clínicos

Regresión lineal y logística · KNN · KMeans · Árboles de decisión — principio lógico, matemática, preprocesamiento, evaluación y código Python con el Iris Dataset.

📈 Reg. Lineal 🔵 Reg. Logística 🔍 KNN 🔵 KMeans 🌳 Árbol de Decisión
Dataset
Iris Dataset · sklearn.datasets · 150 muestras · 4 variables · 3 clases

scikit-learn · pandas · matplotlib · seaborn

🧠
Diapositiva 02 · Marco conceptual
Aprendizaje supervisado vs. no supervisado
Aprendizaje supervisado
El modelo aprende a partir de datos etiquetados: cada ejemplo tiene una respuesta correcta conocida (X → y). El objetivo es aprender la relación para predecir y en datos nuevos.
🎯
Tareas supervisadas
Clasificación — predecir una categoría: enfermo / sano, tipo A / B / C

Regresión — predecir un valor continuo: nivel de glucosa, presión arterial

Nuestros algoritmos: Reg. Lineal · Reg. Logística · KNN · Árbol
Analogía clínica
Aprender a diagnosticar revisando miles de historiales clínicos con diagnóstico confirmado. El médico (modelo) aprende qué síntomas corresponden a qué enfermedad.
Aprendizaje no supervisado
El modelo trabaja con datos sin etiquetas: no hay una respuesta correcta definida. El objetivo es descubrir estructura, patrones o grupos ocultos en los datos.
🔍
Tareas no supervisadas
Clustering — agrupar observaciones similares sin saber a priori cuántos grupos existen

Reducción de dimensiones — comprimir variables manteniendo la información

Nuestro algoritmo: KMeans
Analogía clínica
Analizar perfiles de pacientes sin diagnóstico previo para descubrir subgrupos con características similares — posibles subtipos de enfermedad aún no clasificados.
CaracterísticaSupervisadoNo supervisado
¿Necesita etiquetas (y)?Sí ✓No
¿Qué aprende?Función X → yEstructura de los datos
Métrica de evaluaciónAccuracy, R², Recall...Silhouette, inercia...
Ejemplos en esta claseReg. Lineal, Logística, KNN, ÁrbolKMeans
⚙️
Diapositiva 03 · Flujo de trabajo
El flujo de trabajo de un modelo de Machine Learning
Paso 01
📦
Obtener datos
Cargar dataset, entender su origen y contexto clínico
Paso 02
🔭
EDA
Exploración: shape, dtypes, head, describe, visualizaciones
Paso 03
🧹
Limpiar datos
NaN, duplicados, outliers, corrección de tipos
Paso 04
⚙️
Preprocesar
Escalar, codificar categorías, ingeniería de features
Paso 05
✂️
Split
Dividir en train / test (80/20 o validación cruzada)
Paso 06
🏋️
Entrenar
model.fit(X_train, y_train)
Paso 07
📊
Evaluar
Métricas sobre X_test, ajustar hiperparámetros
El código universal (sklearn)
model = Algoritmo(hiperparámetros)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
score = metrica(y_test, y_pred)
Esta estructura es idéntica para todos los algoritmos de scikit-learn — solo cambia el nombre del algoritmo y sus hiperparámetros.
Regla de oro — nunca violar
El conjunto de test nunca debe verse antes de evaluar el modelo final. Si exploras, ajustas o seleccionas features usando el test set, estás "haciendo trampa" y el modelo no generalizará a datos reales.
Validación cruzada (k-fold)
Divide el train en k partes. Entrena k veces usando una parte distinta como validación cada vez. Promedia los resultados. Más confiable que un solo split — especialmente con datasets pequeños como en contextos clínicos.
🌸
Diapositiva 04 · Dataset
El Iris Dataset — nuestro laboratorio de práctica
python · cargar iris from sklearn.datasets import load_iris import pandas as pd import seaborn as sns iris = load_iris() df = pd.DataFrame(iris.data, columns=iris.feature_names) df["species"] = pd.Categorical.from_codes( iris.target, iris.target_names) # Pair plot — ver relaciones sns.pairplot(df, hue="species")
🌸 Estructura del dataset
VariableTipoRol clínico
sepal length (cm)float64Medida morfológica → predictor
sepal width (cm)float64Medida morfológica → predictor
petal length (cm)float64Medida morfológica → predictor
petal width (cm)float64Medida morfológica → predictor
speciescategórica (3)Diagnóstico → variable objetivo
X e y — vocabulario de sklearn
X → las 4 columnas numéricas (features / predictores)
y → columna species (target, lo que predecimos)

Imita un problema clínico real: medir variables de un paciente para asignarle un diagnóstico.
¿Por qué Iris?
150 muestras · 3 clases balanceadas · sin valores faltantes · bien documentado · ideal para comparar algoritmos en el mismo dataset.
📈
Diapositiva 05 · Regresión Lineal
Regresión Lineal — predecir un valor continuo
Ver video explicativo
Principio lógico
Modela la relación entre una variable dependiente continua (y) y una o más variables independientes (X) ajustando la recta que minimiza el error total de predicción.
Ecuación del modelo
ŷ = β₀ + β₁x₁ + β₂x₂ + … + βₙxₙ
β₀ = intercepto · βᵢ = coeficientes aprendidos · Se optimizan minimizando MSE (mínimos cuadrados)
Supuestos obligatorios
  • Relación lineal entre X e y
  • Residuos con distribución normal
  • Varianza constante de residuos (homocedasticidad)
  • Sin multicolinealidad severa entre predictoras
Aplicación clínica
Predecir nivel de glucosa en función del IMC, dosis óptima según el peso, presión arterial a lo largo del tiempo.
python · regresión lineal con iris from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error, r2_score import matplotlib.pyplot as plt # Predecir petal length desde sepal length X = df[["sepal length (cm)"]] y = df["petal length (cm)"] X_tr, X_te, y_tr, y_te = train_test_split( X, y, test_size=0.2, random_state=42) model = LinearRegression() model.fit(X_tr, y_tr) y_pred = model.predict(X_te) print(f"MSE: {mean_squared_error(y_te, y_pred):.3f}") print(f"R²: {r2_score(y_te, y_pred):.3f}") print(f"β₁: {model.coef_[0]:.3f}") # Visualizar la recta plt.scatter(X_te, y_te) plt.plot(X_te, y_pred, color="red") plt.show()
🔵
Diapositiva 06 · Regresión Logística
Regresión Logística — clasificar con probabilidades
Ver video explicativo
Principio lógico
Pese al nombre, es un clasificador. Modela la probabilidad de pertenecer a una clase aplicando la función sigmoide a una combinación lineal. La salida siempre está entre 0 y 1.
Función sigmoide
P(y=1 | X) = 1 / (1 + e^(−z))
z = β₀ + β₁x₁ + … · Si P ≥ 0.5 → clase 1, si P < 0.5 → clase 0
Supuestos
  • Variable dependiente categórica (binaria o multiclase)
  • Sin multicolinealidad severa entre predictoras
  • Muestra suficientemente grande (≥10 eventos por variable)
Aplicación clínica
Clasificar pacientes como enfermo/sano. Detectar diabetes, riesgo cardiovascular, cáncer benigno/maligno. Los coeficientes dan odds ratios interpretables.
python · regresión logística con iris from sklearn.linear_model import LogisticRegression from sklearn.preprocessing import StandardScaler from sklearn.metrics import classification_report X = iris.data y = iris.target scaler = StandardScaler() X_sc = scaler.fit_transform(X) # escalar siempre X_tr, X_te, y_tr, y_te = train_test_split( X_sc, y, test_size=0.2, random_state=42) model = LogisticRegression(max_iter=200) model.fit(X_tr, y_tr) print(classification_report( y_te, model.predict(X_te), target_names=iris.target_names))
🔍
Diapositiva 07 · KNN
K-Nearest Neighbors — clasificar por similitud
Ver video explicativo
Principio lógico
"Dime con quién andas y te diré quién eres." Para clasificar un nuevo punto, busca los k ejemplos más cercanos en el espacio de características y asigna la clase más frecuente entre ellos. No aprende un modelo — memoriza los datos.
Distancia Euclidiana
d(A,B) = √( Σ (aᵢ − bᵢ)² )
Clase asignada = moda de las k etiquetas más cercanas. k es el hiperparámetro principal.
k pequeñok grande
Fronteras irregulares (overfit)Fronteras suaves (posible underfit)
Muy sensible al ruidoMás robusto, menos preciso en bordes
⚠️ Escalar es obligatorio
KNN usa distancias. Sin escalar, una variable con rango 0–1000 domina sobre una de rango 0–1. Usar StandardScaler siempre.
python · KNN con iris from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import confusion_matrix import seaborn as sns X_sc = StandardScaler().fit_transform(iris.data) X_tr, X_te, y_tr, y_te = train_test_split( X_sc, iris.target, test_size=0.2, random_state=42) knn = KNeighborsClassifier(n_neighbors=5) knn.fit(X_tr, y_tr) # Matriz de confusión cm = confusion_matrix(y_te, knn.predict(X_te)) sns.heatmap(cm, annot=True, fmt="d", xticklabels=iris.target_names, yticklabels=iris.target_names) plt.show()
Aplicación clínica
Diagnóstico por similitud de perfil. Recomendación de tratamiento basada en pacientes anteriores similares. Detección de anomalías en señales fisiológicas.
🔵
Diapositiva 08 · KMeans
KMeans — agrupar sin etiquetas · no supervisado
Ver video explicativo
Principio lógico
No necesita etiquetas. Agrupa los puntos en k clusters de forma que cada punto pertenezca al centroide más cercano. Los centroides se recalculan iterativamente hasta convergencia.
Función objetivo (minimizar)
J = Σₖ Σ_{xᵢ∈Cₖ} ||xᵢ − μₖ||²
μₖ = centroide del cluster k · Alterna: asignar puntos → recalcular centroides
Métrica de evaluación sin etiquetas
Silhouette score ∈ [−1, 1]
Cerca de 1 = clusters bien separados · 0 = fronteras difusas · Negativo = asignación incorrecta
⚠️ Escalar + elegir k
Sensible a escala. Elegir k con el método del codo (inercia vs. k) o maximizando el silhouette score.
python · KMeans con iris from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score import matplotlib.pyplot as plt X_sc = StandardScaler().fit_transform(iris.data) # Método del codo inercias = [] for k in range(1, 9): km = KMeans(n_clusters=k, random_state=42) km.fit(X_sc) inercias.append(km.inertia_) plt.plot(range(1, 9), inercias, "o-") plt.xlabel("k"); plt.ylabel("Inercia"); plt.show() km3 = KMeans(n_clusters=3, random_state=42) etiq = km3.fit_predict(X_sc) print(f"Silhouette: {silhouette_score(X_sc, etiq):.3f}")
Aplicación clínica
Segmentar pacientes por perfil de riesgo sin diagnóstico previo. Descubrir subtipos de enfermedades. Agrupar perfiles genómicos o de biomarcadores.
🌳
Diapositiva 09 · Árbol de Decisión
Árbol de Decisión — el modelo más interpretable
Ver video explicativo
Principio lógico
Divide el espacio de datos con preguntas binarias (si/no) sobre las variables. Cada nodo interior es una pregunta; cada hoja es una clase predicha. Se construye eligiendo la división que más reduce la "impureza" del conjunto.
Criterio de división — Gini Impurity
Gini = 1 − Σ pᵢ²
pᵢ = proporción de clase i en el nodo · Gini = 0 → nodo puro (una sola clase)
Ventajas clínicas únicas
  • No requiere escalar los datos
  • Visualizable como diagrama de flujo
  • Genera reglas explicables al médico
  • Maneja variables mixtas (numéricas y categóricas)
python · árbol de decisión con iris from sklearn.tree import DecisionTreeClassifier, plot_tree from sklearn.metrics import classification_report X_tr, X_te, y_tr, y_te = train_test_split( iris.data, iris.target, test_size=0.2, random_state=42) # Limitar profundidad para evitar overfit tree = DecisionTreeClassifier(max_depth=3, random_state=42) tree.fit(X_tr, y_tr) print(classification_report( y_te, tree.predict(X_te), target_names=iris.target_names)) # Visualizar el árbol plt.figure(figsize=(12, 5)) plot_tree(tree, feature_names=iris.feature_names, class_names=iris.target_names, filled=True) plt.show()
Limitación principal
Inestable — pequeños cambios en los datos producen árboles muy diferentes. Solución: Random Forest (ensemble de muchos árboles).
📊
Diapositiva 10 · Métricas
Métricas de evaluación — ¿qué tan bueno es el modelo?
📋 Para clasificación — la matriz de confusión
MétricaFórmulaCuándo priorizarla
Accuracy(TP+TN) / TotalClases balanceadas
Recall / SensibilidadTP / (TP+FN)No puedes perder enfermos
PrecisiónTP / (TP+FP)Evitar falsos positivos costosos
F1 Score2·P·R / (P+R)Clases desbalanceadas
AUC-ROCÁrea bajo curva ROCComparar modelos entre sí
Costo diferencial en medicina
Un falso negativo (enfermo → sano) suele ser más grave que un falso positivo. En detección de cáncer, preferimos maximizar Recall aunque baje la Precisión. El contexto clínico define qué métrica importa más.
Clases desbalanceadas
Si hay 95% sanos y 5% enfermos, un modelo que siempre predice "sano" tiene 95% accuracy. Usar class_weight="balanced" o técnicas como SMOTE para sobremuestrear la clase minoritaria.
📐 Para regresión
MétricaFórmulaInterpretación
MSEΣ(y − ŷ)² / nError promedio al cuadrado · penaliza outliers
RMSE√MSEMismo rango que y · más interpretable
MAEΣ|y − ŷ| / nMás robusto a outliers
1 − SS_res/SS_tot0–1 · proporción de varianza explicada
🔵 Para clustering (no supervisado)
Silhouette Score
Mide qué tan bien separados están los clusters. Va de −1 a +1. No necesita etiquetas verdaderas para calcularse — es una métrica interna.
👁️
Diapositiva 11 · Interpretabilidad
Interpretabilidad — ¿puede explicarse al médico?
¿Por qué importa en medicina?
En contextos clínicos, un modelo que no puede explicar su decisión es difícil de adoptar. Regulaciones como FDA y CE Mark exigen que los sistemas de apoyo a la decisión clínica sean auditables y explicables. La interpretabilidad no es un lujo — es un requisito.
⭐⭐⭐⭐⭐
Regresión Lineal
Cada coeficiente β tiene un significado directo: "Por cada kg de peso adicional, la presión aumenta β₁ mmHg." Completamente explicable.
⭐⭐⭐⭐
Regresión Logística
Los coeficientes se convierten en odds ratios: "Fumar aumenta el riesgo X veces." Estándar en epidemiología clínica.
⭐⭐⭐⭐⭐
Árbol de Decisión
Genera reglas visuales como diagrama de flujo: "Si petal_length > 2.45 y petal_width ≤ 1.75 → Versicolor." El médico puede seguir la lógica.
⭐⭐
KNN
No genera reglas. Solo puede decir "se parece a estos k pacientes anteriores." Difícil de justificar ante un comité ético.
⭐⭐
KMeans
Los centroides describen el perfil promedio de cada grupo, pero las fronteras no son explícitas. Útil para exploración, no para decisión clínica directa.
SHAP y LIME — interpretabilidad para cajas negras
Para modelos más complejos (Random Forest, redes neuronales), existen técnicas como SHAP (SHapley Additive exPlanations) y LIME que explican la predicción de cualquier modelo de forma local. Son el puente entre precisión e interpretabilidad.
📉
Diapositiva 12 · Generalización
Overfitting y Underfitting — el balance fundamental
🔴
Overfitting (sobreajuste)
El modelo memoriza los datos de entrenamiento, incluyendo el ruido. Funciona perfectamente en train pero falla en datos nuevos.

Train: 99% Test: 62%

Causas: árbol muy profundo, k muy pequeño en KNN, modelo demasiado complejo para los datos disponibles.
🟢
Buen ajuste (generalización)
El modelo aprendió los patrones reales, no el ruido. Funciona bien tanto en train como en test.

Train: 92% Test: 90%

El objetivo: diferencia pequeña entre train y test. El modelo generaliza a nuevos pacientes.
🔵
Underfitting (subajuste)
El modelo es demasiado simple para capturar la relación real entre X e y. Falla tanto en train como en test.

Train: 65% Test: 63%

Causas: árbol poco profundo, k muy grande en KNN, relación no lineal modelada como lineal.
🛠️ Soluciones al overfitting
  • Reducir la complejidad del modelo (max_depth en árboles)
  • Obtener más datos de entrenamiento
  • Regularización (parámetro C en regresión logística)
  • Validación cruzada para detección temprana
  • Usar ensemble (Random Forest en lugar de un árbol)
python · detectar con validación cruzada from sklearn.model_selection import cross_val_score from sklearn.pipeline import Pipeline pipe = Pipeline([ ("sc", StandardScaler()), ("model", KNeighborsClassifier(n_neighbors=5)) ]) scores = cross_val_score( pipe, iris.data, iris.target, cv=5, scoring="accuracy") print(f"CV: {scores.mean():.3f} ± {scores.std():.3f}") # Alta std → posible overfitting/inestabilidad
Diapositiva 13 · Comprensión
Preguntas de comprensión conceptual
P1
¿Cuál es la diferencia fundamental entre aprendizaje supervisado y no supervisado?
  • a El supervisado necesita más datos que el no supervisado
  • b ✓ El supervisado aprende de datos etiquetados (X→y); el no supervisado descubre estructura sin etiquetas
  • c El supervisado solo funciona con variables numéricas
P2
Un hospital necesita detectar cáncer (positivo/negativo). ¿Qué métrica deben priorizar?
  • a Accuracy — mide el total de aciertos
  • b ✓ Recall — un falso negativo (enfermo no detectado) es más grave que un falso positivo
  • c MSE — mide el error promedio de predicción
P3
¿Por qué KNN y KMeans requieren escalar los datos obligatoriamente?
  • a Porque scikit-learn lo exige en su implementación
  • b ✓ Porque ambos calculan distancias — sin escalar, la variable de mayor rango domina artificialmente
  • c Porque el escalado mejora la velocidad de cómputo
P4
Un árbol entrenado tiene 99% en train y 62% en test. ¿Qué está pasando?
  • a El modelo está bien calibrado — la diferencia es normal
  • b ✓ Overfitting — memorizó el dataset. Solución: reducir max_depth o usar validación cruzada
  • c El dataset de test tiene errores de etiquetado
P5
¿Por qué es crítico no usar el test set durante el entrenamiento o la selección de features?
  • a Porque el test set no tiene etiquetas
  • b ✓ Porque "contaminar" el test set sobreestima el rendimiento real y el modelo no generalizará a nuevos pacientes
  • c Porque aumenta el tiempo de entrenamiento
P6
Un médico necesita justificar ante el comité ético por qué el modelo clasificó a un paciente como "alto riesgo". ¿Qué algoritmo conviene más?
  • a KNN — es el más preciso con muchos datos
  • b ✓ Árbol de Decisión o Regresión Logística — generan reglas o coeficientes explicables directamente
  • c KMeans — porque agrupa a los pacientes visualmente
✓ Sesión completada

Ideas clave

Supervisado vs no sup.
Supervisado: aprende X→y con etiquetas. No supervisado: descubre estructura sin etiquetas. KMeans es el único no supervisado de los 5.
Flujo de trabajo
Obtener → EDA → Limpiar → Preprocesar → Split → Entrenar → Evaluar. El test set nunca se toca hasta la evaluación final.
Reg. Lineal
Valores continuos. ŷ = β₀ + βᵢxᵢ. Supuestos: linealidad, normalidad. Métricas: R², MSE.
Reg. Logística
Clasifica con sigmoide. Alta interpretabilidad (odds ratios). Escalar siempre. Priorizar Recall en diagnóstico.
KNN
Memoriza datos, clasifica por vecindad. Escalar obligatorio. k controla bias-varianza.
KMeans
No supervisado. Escalar obligatorio. Elegir k con método del codo + silhouette.
Árbol
No escalar. Visualizable. max_depth controla overfitting. El más interpretable de los cinco.
Over/Underfitting
Overfit: memoriza ruido (train»test). Underfit: modelo simple (train≈test, ambos malos). Validación cruzada para detectar.
TECNOLOGÍAS
scikit-learn · pandas · numpy · matplotlib · seaborn
Dataset: Iris · sklearn.datasets.load_iris()